package com.liu.tools;

import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
 * 根据参数生成，api调用的token(签名)
 * 
 * @author michael
 *
 */
public class TokenUtils {
	
	private static Logger logger = LoggerFactory.getLogger(TokenUtils.class);
	
	/**
	 * 
	 * @param jo 参数对象
	 * @param secret 密钥
	 * @return token
	 */
	public static String toToken(JSONObject jo, String secret) {
		if (jo == null || StringUtils.isEmpty(secret))
			return "";
		Set<String> keys = jo.keySet();
		// List<String> orderKeys = new ArrayList<String>();
		StringBuilder sb = new StringBuilder();
		// 除token外其他参数都按参数名排序进行参数值拼接后
		keys.stream().sorted()
				.filter((s -> !s.equals("pageNum") && !s.equals("pageSize") && !s.equals("token") && !s.equals("ip") && !s.equals("ext") 
						&& (!(jo.get(s) instanceof JSONObject || jo.get(s) instanceof JSONArray))))
				.forEach(s -> sb.append(jo.getString(s)));
		sb.append(secret);
		
		logger.debug("cmd=TokenUtils:toToken msg=original token:" + sb.toString() + "  req param:" + JSON.toJSONString(jo));
		
		return MD5Util.MD5(sb.toString());
	}
	
	
	/**
	 * @DateTime 2015年3月31日 上午9:50:16
	 * @Author 刘兴密
	 * @QQ 63972012
	 * @Desc token 验证
	 * @param jo
	 * @param secret
	 * @return
	 * boolean
	 */
	public static boolean tokenValid(JSONObject jo, String secret) {
		
		String svrToken = toToken(jo, secret);	
		logger.debug("cmd=TokenUtils:tokenValid msg=original token:" + svrToken);	
		
		if(svrToken.equals(jo.getString("token"))){
			return true;
		}
		
		logger.error("cmd=TokenUtils:tokenValid msg=token validtate fail! svrToken:" + svrToken + "   reqToken:" + jo.getString("token"));
		
		return false;		
		
	}
	
	/**
	 * 
	 * @param jo 参数对象
	 * @param secret 密钥
	 * @return token
	 */
	public static String toTokenStr(JSONObject jo) {
		if (jo == null)
			return "";
		Set<String> keys = jo.keySet();
		// List<String> orderKeys = new ArrayList<String>();
		StringBuilder sb = new StringBuilder();
		// 除token外其他参数都按参数名排序进行参数值拼接后
		keys.stream().sorted()
				.filter((s -> !s.equals("pageNum") && !s.equals("pageSize") && !s.equals("token") && !s.equals("ip") && !s.equals("ext")
						&& (!(jo.get(s) instanceof JSONObject || jo.get(s) instanceof JSONArray))))
				.forEach(s -> sb.append(jo.getString(s)));
				
		logger.debug("cmd=TokenUtils:toToken msg=original token:" + sb.toString() + "  req param:" + JSON.toJSONString(jo));
		
		return sb.toString();
	}
	
}
